package org.jgs1904.controller;


import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

    private static Subject subject1;

    static {
        // 1.获取SecurityManager对象
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        // 2.获取SubJect对象
        SecurityUtils.setSecurityManager(securityManager);
        subject1 = SecurityUtils.getSubject();
    }

    // 声明单元方法，完成登录
    @RequestMapping("userLogin")
    @ResponseBody
    public String userLogin(String uname, String pwd) {
        // 1.获取SecurityManager对象
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        // 2.获取SubJect对象
        SecurityUtils.setSecurityManager(securityManager);
        Subject subject = SecurityUtils.getSubject();
        // 3.调用登录认证方法
        // 创建对象存储认证信息
        AuthenticationToken token = new UsernamePasswordToken(uname, pwd);
        // 完成登录认证
        try {
            // login()方法没有返回值，只能通过是否有异常判断是否登录成功。
            subject.login(token);
            return "登录成功";
        } catch (UnknownAccountException e) {
            System.out.println("账号不存在");
            return "账号不存在";
        } catch (IncorrectCredentialsException e) {
            System.out.println("密码错误");
            return "密码错误";
        } catch (AuthenticationException e) {
            e.printStackTrace();
            return "权限不足";
        }
    }


    // 声明单元方法，完成登录
    @RequestMapping("userLogin1")
    public String userLogin1(String uname, String pwd) {
        // 1.获取SecurityManager对象
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        // 2.获取SubJect对象
        SecurityUtils.setSecurityManager(securityManager);
        Subject subject = SecurityUtils.getSubject();
        // 3.调用登录认证方法
        // 创建对象存储认证信息
        AuthenticationToken token = new UsernamePasswordToken(uname, pwd);
        // 完成登录认证
        try {
            // login()方法没有返回值，只能通过是否有异常判断是否登录成功。
            subject1.login(token);
            // 重定向
            return "redirect:/userSq";
        } catch (UnknownAccountException e) {
            System.out.println("账号不存在");
            return "账号不存在";
        } catch (IncorrectCredentialsException e) {
            System.out.println("密码错误");
            return "密码错误";
        } catch (AuthenticationException e) {
            e.printStackTrace();
            return "权限不足";
        }
    }


    // 声明单元方法:授权
    @RequestMapping("userSq")
    @ResponseBody
    public String userSq() {

        /**
         * Shiro 的 SecurityManager 未全局共享
         * 你在每个请求中都重新创建了 SecurityManager 并设置到 SecurityUtils：
         * 这会导致每次请求都是一个新的安全上下文，之前的登录信息不会保留。
         */
        Subject subject = SecurityUtils.getSubject();
        // 授权认证
        // 角色判断
        boolean role1 = subject1.hasRole("role1");
        System.out.println("判断是否具备角色:" + role1);
        // 权限判断
        // subject.checkPermission("sys:user:insert");//如果认证成功的用户有权限则正常执行，没有则报错
        boolean permitted = subject.isPermitted("permission1");// 权限判断，返回boolean值，true表示具备，false表示不具备
        System.out.println("权限判断结果:" + permitted);
        return "授权的角色判断结果:" + role1 + "权限判断结果:" + permitted;
    }


}
